/**
 *	@file	tr_house.c
 *	@brief	トレーナーハウスセーブデータ
 *	@author	Miyuki Iwasawa
 *	@date	09.03.25
 */

#include "common.h"
#include "savedata/savedata_def.h"
#include "savedata/savedata.h"

#include "system/gamedata.h"
#include "system/pms_data.h"
#include "system/buflen.h"
#include "system/msgdata.h"
#include "system/pm_str.h"
#include "gflib/strbuf.h"
#include "gflib/strbuf_family.h"
#include "battle/battle_common.h"

#include "poketool/poke_tool.h"
#include "poketool/pokeparty.h"
#include "savedata/mystatus.h"
#include "savedata/b_tower.h"
#include "savedata/tr_house.h"
#include "savedata/tr_house_data.h"	//include許可制

#ifdef _NITRO
// 構造体が想定のサイズとなっているかチェック
SDK_COMPILER_ASSERT(sizeof(TR_HOUSE_POKEMON) == 56);
SDK_COMPILER_ASSERT(sizeof(TR_HOUSE_PLAYER) == 48);
SDK_COMPILER_ASSERT(sizeof(TR_HOUSE_TRAINER) == 384);
SDK_COMPILER_ASSERT(sizeof(PMS_DATA) == 8);
SDK_COMPILER_ASSERT(sizeof(TR_HOUSE_SAVE) == 3840);
#endif


////////////////////////////////////////////////////////////////////////////////////////
//プロトタイプ
static void player_CorrectMyData(TR_HOUSE_PLAYER* pl,SAVEDATA* save);
static void poke_CorrectMyPokeData(TR_HOUSE_POKEMON* poke_tbl,POKEPARTY* party);


////////////////////////////////////////////////////////////////////////////////////////
/**
 *	@brief	ハウス　セーブデータワークサイズ
 */
int TrHouseSave_GetWorkSize(void)
{
	return sizeof(TR_HOUSE_SAVE);
}

/**
 *	@brief	ハウス　セーブデータポインタ取得
 */
TR_HOUSE_SAVE* SaveData_GetTrHouseSave(SAVEDATA* sv)
{
	return SaveData_Get(sv,GMDATA_ID_TR_HOUSE_SAVE);
}

/**
 *	@brief	ハウス　ポケモンデータサイズ
 */
int TrHousePoke_GetWorkSize(void)
{
	return sizeof(TR_HOUSE_POKEMON);
}

/**
 *	@brief	ハウス　トレーナーデータサイズ
 */
int TrHouseTrainer_GetWorkSize(void)
{
	return sizeof(TR_HOUSE_TRAINER);
}

/**
 *	@brief	ハウス　セーブデータクリア
 */
void TrHouseSave_Clear(TR_HOUSE_SAVE* sv)
{
	int i;
	MI_CpuClear8(sv,sizeof(TR_HOUSE_SAVE));

	for(i = 0;i < TR_HOUSE_TRAINER_MAX;i++){
		TrHouseTrainer_Clear(&sv->trainer[i]);
	}
}

/**
 *	@brief	ハウス　ポケモンデータクリア
 */
void TrHousePoke_Clear(TR_HOUSE_POKEMON* poke)
{
	MI_CpuClear8(poke,sizeof(TR_HOUSE_POKEMON));
	PM_strclearEOM_( poke->nickname, MONS_NAME_SIZE );
}

/**
 *	@brief	ハウス　プレイヤーデータクリア
 */
void TrHousePlayer_Clear(TR_HOUSE_PLAYER* pl)
{
	MI_CpuClear8(pl,sizeof(TR_HOUSE_PLAYER));
	PM_strclearEOM_( pl->name, PERSON_NAME_SIZE+EOM_SIZE );
}

/**
 *	@brief	ハウス　トレーナーデータクリア
 */
void TrHouseTrainer_Clear(TR_HOUSE_TRAINER* pt)
{
	int i;

	TrHousePlayer_Clear(&pt->player);
	for(i = 0;i < TR_HOUSE_POKE_MAX;i++){
		TrHousePoke_Clear(&pt->poke[i]);
	}
}

/**
 *	@brief	トレーナーデータが有効かどうか返す
 */
BOOL TrHouseTrainer_IsEnable(TR_HOUSE_TRAINER* pt)
{
	//一番目の手持ちのモンスターナンバーが0ならば無効
	if(pt->poke[0].mons_no == 0){
		return FALSE;
	}
	return TRUE;
}

/**
 *	@brief	同一プレイヤーのデータかどうかを判定
 */
BOOL TrHousePlayer_IsSamePlayerData(TR_HOUSE_PLAYER* pl1,TR_HOUSE_PLAYER* pl2)
{
	if(	(pl1->tr_id != pl2->tr_id) ||
		(pl1->version != pl2->version) ||
		(pl1->region != pl2->region) ||
		(pl1->tr_sex != pl2->tr_sex)){
		return FALSE;
	}
	if(PM_strcmp(pl1->name,pl2->name)){
		return FALSE;
	}
	return TRUE;
}
